20. 常用图形绘制

本章学习目标

  • 掌握柱状图与条形图的绘制方法
  • 学会为图表添加数值标签
  • 理解双轴图的应用场景
  • 根据数据类型选择合适的图表

选择合适的图表

不同数据类型需要不同的图表:

数据类型 推荐图表 说明
时间序列 折线图 展示趋势
分类比较 柱状图/条形图 比较大小
相关性 散点图 观察关系
占比 饼图 显示份额
分布 直方图/箱线图 显示分布

⭐ 中国GDP省份排名TOP5

平台任务解答代码

以下代码与教学平台任务要求完全一致:

# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
# 导入模块
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用黑体显示中文

# 构建数据
GDP = [129118.6,122875.6,87435.1,77715.4,61345.1]

# 绘图
plt.bar(range(5),GDP,align = "center",color = "steelblue",alpha = 0.6)
# 添加y轴标签
plt.ylabel("GDP:亿元人民币")
# 设置Y轴的刻度范围
plt.ylim([40000,150000])
# 添加x轴刻度标签
plt.xticks(range(5),['广东省','江苏省','山东省','浙江省','河南省'])
# 添加标题
plt.title('2022年中国GDP排名前5的省份')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP):
  plt.text(x,y+300,s=y,ha='center')  # 添加文本标注
# 保存图形
plt.savefig("1.png")
plt.show()  # 显示图形
Listing 1

柱状图 vs 条形图:何时使用?

  • 柱状图(垂直):适合类别名称短、强调数值高度差异
  • 条形图(水平):适合类别名称长、便于阅读标签
  • 两者本质相同,只是方向不同

准备数据:构建DataFrame

Listing 2
import matplotlib.pyplot as plt
import pandas as pd

# 2022年GDP排名前五省份数据(单位:亿元)
data = {
    '省份': ['广东', '江苏', '山东', '浙江', '河南'],
    'GDP': [129118, 122875, 87435, 77715, 61345]
}
df = pd.DataFrame(data)

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

print(df)
   省份     GDP
0  广东  129118
1  江苏  122875
2  山东   87435
3  浙江   77715
4  河南   61345

绘制柱状图与条形图

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 子图1:纵向柱状图
axes[0].bar(df['省份'], df['GDP'], color='steelblue', edgecolor='black')
axes[0].set_title('中国GDP排名TOP5(柱状图)', fontsize=14)
axes[0].set_xlabel('省份', fontsize=12)
axes[0].set_ylabel('GDP(亿元)', fontsize=12)
axes[0].grid(axis='y', alpha=0.3)

# 子图2:横向条形图
axes[1].barh(df['省份'], df['GDP'], color='coral', edgecolor='black')
axes[1].set_title('中国GDP排名TOP5(条形图)', fontsize=14)
axes[1].set_xlabel('GDP(亿元)', fontsize=12)
axes[1].grid(axis='x', alpha=0.3)

plt.tight_layout()
plt.show()
Figure 1: 中国GDP排名TOP5:柱状图与条形图对比

为图表添加数值标签

数值标签让读者无需对照坐标轴即可读取精确值:

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 柱状图 + 数值标签
axes[0].bar(df['省份'], df['GDP'], color='steelblue', edgecolor='black')
axes[0].set_title('柱状图:数值标签在顶部', fontsize=14)
axes[0].set_ylabel('GDP(亿元)', fontsize=12)
for i, v in enumerate(df['GDP']):
    axes[0].text(i, v + 2000, f'{v:,}', ha='center', fontsize=10)

# 条形图 + 数值标签
axes[1].barh(df['省份'], df['GDP'], color='coral', edgecolor='black')
axes[1].set_title('条形图:数值标签在右侧', fontsize=14)
axes[1].set_xlabel('GDP(亿元)', fontsize=12)
for i, v in enumerate(df['GDP']):
    axes[1].text(v + 2000, i, f'{v:,}', va='center', fontsize=10)

plt.tight_layout()
plt.show()
Figure 2: 带数值标签的柱状图与条形图

数值标签的关键参数

  • plt.text(x, y, s, ha, va, fontsize) 用于添加文本
  • 柱状图x 为柱子索引,y 为柱顶上方偏移
  • 条形图x 为条形右端偏移,y 为条形索引
  • ha='center':水平居中对齐
  • va='center':垂直居中对齐
  • f'{v:,}':千位分隔符格式化数值

GDP数据统计分析

Listing 3
# 五省GDP总和
total_gdp = df['GDP'].sum()

# 各省占比
gdp_share = df['GDP'] / total_gdp * 100

print('详细数据:')
for _, row in df.iterrows():
    print(f"  {row['省份']}: {row['GDP']:,}亿元")

print(f'\n五省GDP总计: {total_gdp:,}亿元')
print(f'占全国GDP比例(假设全国为100万亿): {total_gdp/1000000:.1%}')
详细数据:
  广东: 129,118亿元
  江苏: 122,875亿元
  山东: 87,435亿元
  浙江: 77,715亿元
  河南: 61,345亿元

五省GDP总计: 478,488亿元
占全国GDP比例(假设全国为100万亿): 47.8%

高级技巧:双轴图的应用场景

当需要在同一图表中展示两个不同量纲的变量时,使用双轴图:

  • 股票价格(元)与成交量(万股)
  • 收益率(%)与波动率(%)
  • 利率通胀率

核心方法:ax1.twinx() 创建共享x轴的第二个y轴

绘制双轴图

import numpy as np

fig = plt.figure(figsize=(12, 6))

# 生成示例数据
np.random.seed(42)
x = np.arange(10)
y1 = np.random.randn(10).cumsum()
y2 = np.random.randn(10).cumsum() * 100

# 左y轴:收益率(蓝色)
ax1 = fig.add_subplot(111)
ax1.plot(x, y1, 'b-', label='收益率', linewidth=2)
ax1.set_xlabel('时间', fontsize=12)
ax1.set_ylabel('收益率', fontsize=12, color='b')
ax1.tick_params(axis='y', labelcolor='b')
ax1.legend(loc='upper left')

# 右y轴:成交量(红色)
ax2 = ax1.twinx()
ax2.plot(x, y2, 'r-', label='成交量', linewidth=2)
ax2.set_ylabel('成交量', fontsize=12, color='r')
ax2.tick_params(axis='y', labelcolor='r')
ax2.legend(loc='upper right')

ax1.set_title('双轴图:收益率与成交量', fontsize=14)
plt.show()
Figure 3: 双轴图:收益率与成交量

双轴图的关键代码解析

  • ax1 = fig.add_subplot(111):创建主坐标轴
  • ax2 = ax1.twinx():创建共享x轴的第二个y轴
  • 左轴用蓝色,右轴用红色,形成视觉区分
  • tick_params(labelcolor=...) 使刻度颜色与曲线一致

注意:双轴图可能产生视觉误导,确保两个变量确实相关且值得同时展示。

本章小结

图表类型 核心函数 适用场景
柱状图 plt.bar() 分类数值比较
条形图 plt.barh() 长标签分类比较
数值标签 plt.text() 标注精确数值
双轴图 ax.twinx() 双量纲对比